package com.treeroot.orderservice.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.treeroot.commonutils.exceptionhandler.MyException;
import com.treeroot.commonutils.result.R;
import com.treeroot.orderservice.order.client.Flag;
import com.treeroot.orderservice.order.client.PlaneClient;
import com.treeroot.orderservice.order.entity.PcOrder;
import com.treeroot.orderservice.order.entity.PcPayLog;
import com.treeroot.orderservice.order.mapper.PcPayLogMapper;
import com.treeroot.orderservice.order.service.PcOrderService;
import com.treeroot.orderservice.order.service.PcPayLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 支付日志表 服务实现类
 * </p>
 *
 * @author TreeRoot
 * @since 2022-05-18
 */

@Service
@Transactional
public class PcPayLogServiceImpl extends ServiceImpl<PcPayLogMapper, PcPayLog> implements PcPayLogService {

    @Autowired
    private PcOrderService payOrderService;

    @Autowired
    private PlaneClient planeClient;  //远程调用航班信息
    @Autowired
    private Flag flag;

    /**
     * 支付 ....直接支付成功....然后插入到支付日志表
     * 订单号 支付完成时间  支付金额（分） 交易流水号  交易状态
     *
     * @param order 0未支付1已支付
     */

//    TODO:封装条件  搞好乐观锁
    @Override
    public R paymentOrRefund(PcOrder order) {
        PcPayLog log = new PcPayLog();
        String transactionId = UUID.randomUUID().toString().replace("-", "");//通过UUID生成流水号

        /**
         * ======================================付款流程   传入需要付款的订单的实体类的 订单号  还有订单id    去修改 订单的状态
         *                                                 以及 插入一条 支付日志的 订单号
         *                                                 以及 传入  需要支付的航班号的id  远程调用余票 -1 的接口 去修改剩余机票
         *
         */
        if (order.getType().equals("付款")) {
            //远程调用航班信息根据航班id
            // 修改支付状态为微信已支付状态
            order.setStatus(1);
            order.setPayType(1);
            order.setPlaneType(order.getPlaneType());
            PcOrder pcOrder = payOrderService.getById(order.getId()); //通过orderId去查找这条数据 把这条数据的值给到订单日志表
            Integer totalFee = pcOrder.getTotalFee();
            payOrderService.updateById(order); //注意  更新传的是实体类  实质是哪个还是根据 传的  实体类中的 id 去更新的  所以  这里order.id可以从地址栏里去拿


            //插入支付记录表单记录
            log.setOrderNo(order.getOrderNo());  //订单号
            log.setTransactionId(transactionId);//流水号
            log.setTotalFee(totalFee);//存入支付金额  【这里失败了 失败原因 ....未能获取到order.getTotalFee()  或者  order.getTotalFee()为 空】
            log.setPlaneType(order.getPlaneType());
            log.setTradeState("已支付");//支付状态
            baseMapper.insert(log);
            if (planeClient.getPlaneInfoOrder(order.getPlaneId(), order.getPlaneType()).getFlag() != 0        //      如果剩余票数为0 则机票状态 不可进行支付  这里要去拿到支付的订单号的id然后去查出他的flag=0？
            ) {
                //剩余票数减一
                R r = this.flag.updatePlaneByIdOrder(order.getPlaneId(), order.getType(),order.getPlaneType());
                if (r.getCode() == 20001) {
                    System.out.println("支付成功");
                    String id = log.getId();
//                    返回生成的支付日志的id
                    return R.ok().message(id);
                }
            } else
                throw new MyException(20000, "该航班号已售空");
            /**
             * ==========================================退款流程         传入需要付款的订单的实体类的 订单号  还有订单id    去修改 订单的状态
             *                                                          以及 插入一条 支付日志的 订单号
             *                                                          以及 传入  需要支付的航班号的id  远程调用余票 -1 的接口 去修改剩余机票
             *                                                          以及 传入 需要 修改的 支付日志表中的 支付状态
             *
             */

        } else if (order.getType().equals("退款")) {

            // 修改支付状态为微信未支付状态
            order.setStatus(0);
            order.setTotalFee(log.getTotalFee());//退了都是钱
            PcOrder pcOrder = payOrderService.getById(order.getId()); //通过orderId去查找这条数据 把这条数据的值给到订单日志表
            Integer totalFee = pcOrder.getTotalFee();
            payOrderService.updateById(order);

            //插入支付记录表单记录
            log.setId(order.getLogId());//id
            log.setOrderNo(order.getOrderNo());//订单号
            log.setTotalFee(totalFee);//退了多少钱
            log.setTransactionId(transactionId);//流水号
            log.setPlaneType(order.getPlaneType());
            log.setTradeState("已退款");//支付状态
             baseMapper.updateById(log);                      //如果插入 更新失败 泽 返回 返单不存在

            //剩余票数+1
            R r = this.flag.updatePlaneByIdOrder(order.getPlaneId(), order.getType(),order.getPlaneType());

            if (r.getCode() == 20001) {
                System.out.println("退款成功");
                String id = log.getId();
                return R.ok().message(id);
            }
        } else
            throw new MyException(20000, "没想到操作");
        return R.error();
    }

    /**
     * 支付日志表分页
     *
     * @param current
     * @param limit
     * @return
     */
    @Override
    public Map getOrderList(long current, long limit) {
        Page<PcPayLog> orderPage = new Page<>(current, limit);
        baseMapper.selectPage(orderPage, null);
        List<PcPayLog> records = orderPage.getRecords();
        long total = orderPage.getTotal();
        Map map = new HashMap();
        map.put("total", total);
        map.put("rows", records);
        return map;
    }

    /**
     * 支付日志表条件分页查询
     *
     * @param current
     * @param limit
     * @param log
     * @return
     */
    @Override
    public Map getQueryLogList(long current, long limit, PcPayLog log) {
        Page<PcPayLog> orderPage = new Page<>(current, limit);
        LambdaQueryWrapper<PcPayLog> wrapper = new QueryWrapper<PcPayLog>().lambda()
                .eq(!StringUtils.isEmpty(log.getOrderNo()),
                        PcPayLog::getOrderNo,
                        log.getOrderNo()
                );

        baseMapper.selectPage(orderPage, wrapper);
        long total = orderPage.getTotal();
        List<PcPayLog> records = orderPage.getRecords();
        Map map = new HashMap();
        map.put("total", total);
        map.put("rows", records);
        return map;
    }
}
